package fr.opensagres.nosql.ide.mongodb.core.model;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import fr.opensagres.nosql.ide.core.model.AbstractDatabase;
import fr.opensagres.nosql.ide.core.model.ICollection;
import fr.opensagres.nosql.ide.core.model.IServer;
import fr.opensagres.nosql.ide.core.model.Users;
import fr.opensagres.nosql.ide.core.utils.StringUtils;
import fr.opensagres.nosql.ide.mongodb.core.model.stats.CollectionListStats;
import fr.opensagres.nosql.ide.mongodb.core.model.stats.CollectionStats;
import fr.opensagres.nosql.ide.mongodb.core.shell.MongoShellCommandManager;
public class Database extends AbstractDatabase {
private DB db;
private boolean alreadyAuthenticated;
private CollectionsCategory collectionsCategory;
public Database(String name) {
super(name);
this.alreadyAuthenticated = false;
this.collectionsCategory = new CollectionsCategory();
// force compute of static children nodes.
getChildren();
}
@Override
protected void doGetChildren() throws Exception {
// Collections folder
super.addNode(collectionsCategory);
// Stored javascript folder
super.addNode(new StoredJavascriptCategory());
// // GridFS folder
super.addNode(new GridFSCategory());
// // Users
super.addNode(new Users());
}
public DB getDB() throws UnknownHostException, MongoException {
boolean databaseChanged = ((MongoServer) getParent())
.selectDatabase(this);
if (db == null || databaseChanged) {
db = getInternalDB();
}
return db;
}
private DB getInternalDB() throws UnknownHostException, MongoException {
MongoServer server = (MongoServer) getParent();
// 1) use databseName
DB db = MongoShellCommandManager.getInstance().use(server,
server.getMongo(), getName());
String username = server.getUsername();
// 2) authenticate if needed
if (StringUtils.isNotEmpty(username) && !alreadyAuthenticated) {
MongoShellCommandManager.getInstance().authenticate(server, db,
username, server.getPasswordAsCharArray());
alreadyAuthenticated = true;
}
return db;
}
public List<ICollection> getCollections() {
return collectionsCategory.getCollections();
}
public CollectionsCategory getCollectionsCategory() {
return collectionsCategory;
}
public List<CollectionStats> createStats() throws UnknownHostException,
MongoException {
List<ICollection> collections = getCollections();
CollectionListStats collectionStats = new CollectionListStats(
collections.size());
for (ICollection collection : collections) {
collectionStats.addCollection((Collection) collection);
}
return collectionStats;
}
public List<DBObject> getUsers() throws UnknownHostException,
MongoException {
return MongoShellCommandManager.getInstance().getSystemUsers(
getParent(), getDB());
}
public String getMongoConsoleCommand(boolean withBaseDir) {
StringBuilder connection = new StringBuilder("");
if (!withBaseDir) {
connection.append("mongo");
} else {
// mongo.exe
MongoServerRuntime runtime = (MongoServerRuntime) getParent()
.getRuntime();
connection.append(runtime.getMongoProcessLocation().toFile()
.toString());
}
// Host+Port/Database
connection.append(" ");
connection.append(getStartMongoConsoleCommand());
// Args
List<String> args = getMongoConsoleArgs();
for (String arg : args) {
connection.append(" ");
connection.append(arg);
}
return connection.toString();
}
public List<String> getMongoConsoleArgs() {
List<String> args = new ArrayList<String>();
updateMongoConsoleArgs(args);
return args;
}
public void updateMongoConsoleArgs(List<String> args) {
// Username+password
IServer server = getParent();
String username = server.getUsername();
if (StringUtils.isNotEmpty(username)) {
args.add("-u");
args.add(username);
}
String password = server.getPassword();
if (StringUtils.isNotEmpty(password)) {
args.add("-p");
args.add(password);
}
}
public String getStartMongoConsoleCommand() {
StringBuilder connection = new StringBuilder();
IServer server = getParent();
Integer port = server.getPort();
connection.append(server.getHost());
if (port != null) {
connection.append(":");
connection.append(port.toString());
}
// Database
connection.append("/");
connection.append(getName());
return connection.toString();
}
}